/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controle;

import Entidades.Link;
import Entidades.No;
import Entidades.LocalizadoraDeNos;
import Entidades.LocalizadoraLinks;
import java.util.ArrayList;
import javax.swing.JOptionPane;


/**
 *
 * @author Adriano
 */
public class Algoritmo {
    private static limite.Apresentacao tela;

    /**
     * implementa o algoritmo Clark e Right
     * @param origem
     * @param destino
     * @return 
     */
    public static ArrayList<No> clarkWright(No origem, No destino){
        return null;
    }
   
    //apartir do destino é possível descobrir a rota até ele percorrendo os predecessores
    private static ArrayList<No> constituiRota(No destino){
        ArrayList<No> melhorCaminho = new ArrayList<No>();
        melhorCaminho.add(destino);
        No predecessor = destino.getPredecessor();
        while (!(predecessor == null)) {
            melhorCaminho.add(predecessor);
            predecessor = predecessor.getPredecessor();

        }
        return melhorCaminho;
    }

    // este metodo é utilizado para receber as entradas, porcessar, e retornar a saída para o usuário
    public static void executa(int idorigem,int iddestino,limite.Apresentacao apresentacao) {
        tela=apresentacao;
        No origem=LocalizadoraDeNos.busca(idorigem);
        No destino=LocalizadoraDeNos.busca(iddestino);
        ArrayList<No> rota = clarkWright(origem,destino); //IMPLEMENTAR
        if(rota==null){
            System.out.println("Algoritmo não foi capaz e idetificar o melhor caminho!");
            JOptionPane.showMessageDialog(apresentacao, "Algoritmo não foi capaz e idetificar o melhor caminho!");
            return;
        }
        //preencge campo menor distância
        tela.insereMelhorDistância(ControleNos.distancia(rota));
        //apresentação dos resultados na tela
        marcaDistancias();
        tela.atualiza();
        marcaCaminhoMinimo(rota);
        tela.atualiza();
    }
    
    // este metodo é utilizado para receber as entradas, porcessar, e retornar a saída para o usuário
    public static void executaCW(int idorigem,int iddestino,limite.Apresentacao apresentacao) {
        tela=apresentacao;
        No origem=LocalizadoraDeNos.busca(idorigem);
        No destino=LocalizadoraDeNos.busca(iddestino);
        ArrayList<No> rota = clarkWright(origem,destino);
        if(rota==null){
            System.out.println("Algoritmo não foi capaz e idetificar o melhor caminho!");
            JOptionPane.showMessageDialog(apresentacao, "Algoritmo não foi capaz e idetificar o melhor caminho!");
            return;
        }
        //preencge campo menor distância
        tela.insereMelhorDistância(ControleNos.distancia(rota));
        //apresentação dos resultados na tela
        marcaDistancias();
        tela.atualiza();
        marcaCaminhoMinimo(rota);
        tela.atualiza();
    }

    //utilizado para destacar o caminho escolhido na tela
    private static void marcaCaminhoMinimo(ArrayList<No> rota) {
        for (int i = 0; i < rota.size(); i++) {
            try {
                No origem = rota.get(i);
                No destino = rota.get(i + 1);
                tela.marcaCaminho(origem.getIdentificador(), destino.getIdentificador());
            } catch (Exception e) {
            }
        }
    }

    //utilizado para marcar o tamanho de cada link na tela
    private static void marcaDistancias(){
        ArrayList<Link> links=LocalizadoraLinks.getLista();
        for(int i=0;i<links.size();i++){
            Link l=(Link)LocalizadoraLinks.getLink(i);
            No origem=l.getOrigem();
            No destino=l.getDestino();
            tela.registraDistancia(origem.getIdentificador(),destino.getIdentificador(),ControleNos.calculaDistancia(origem, destino));
        }
    }
}


